﻿using System;

using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Maestro_Proveedores.Forms
{
    public partial class RevisarEstadoProveedores : Form
    {
        private _Maestro_Proveedores_CORPORATIVADataSet cORPORATIVADataSet = new  _Maestro_Proveedores_CORPORATIVADataSet();
        private _Maestro_Proveedores_CORPORATIVADataSetTableAdapters.PRV_PROVEEDORTableAdapter pRV_PROVEEDORTableAdapter = new _Maestro_Proveedores_CORPORATIVADataSetTableAdapters.PRV_PROVEEDORTableAdapter();
        private _Maestro_Proveedores_CORPORATIVADataSetTableAdapters.PRV_DEVOLUCIONTableAdapter pRV_DEVOLUCIONTableAdapter = new _Maestro_Proveedores_CORPORATIVADataSetTableAdapters.PRV_DEVOLUCIONTableAdapter();
        private _Maestro_Proveedores_CORPORATIVADataSetTableAdapters.CONSULTA_proveedoresTableAdapter cONSULTA_proveedoresTableAdapter = new _Maestro_Proveedores_CORPORATIVADataSetTableAdapters.CONSULTA_proveedoresTableAdapter();

        private MAPICS.MAPICSDataSet mAPICSDataSet = new MAPICS.MAPICSDataSet();
        private MAPICS.MAPICSDataSetTableAdapters.PROVEEDORESTableAdapter pROVEEDORESTableAdapter = new MAPICS.MAPICSDataSetTableAdapters.PROVEEDORESTableAdapter();
        private MAPICS.MAPICSDataSet.PROVEEDORESDataTable pROVEEDORESDataTable = new MAPICS.MAPICSDataSet.PROVEEDORESDataTable();

        private MAPICS.MAPICSDataSetTableAdapters.INF_VR_SITableAdapter iNF_VR_SITableAdapter = new MAPICS.MAPICSDataSetTableAdapters.INF_VR_SITableAdapter();
        private MAPICS.MAPICSDataSetTableAdapters.INF_VR_NOTableAdapter iNF_VR_NOTableAdapter = new MAPICS.MAPICSDataSetTableAdapters.INF_VR_NOTableAdapter();
        private MAPICS.MAPICSDataSetTableAdapters.INF_OCTableAdapter iNF_OCTableAdapter = new MAPICS.MAPICSDataSetTableAdapters.INF_OCTableAdapter();

        /// <summary>
        /// <para>Este formulario auxiliar permite revisar el estado de los proveedores (fechas de vencimiento, ceuntas bancarias, bienes principales, etc). Tambien tiene la responsabilidad de verificar los nuevos VR's que pudiesen ser registrados en INFOR (esta tarea se hace con la ayuda de las vistas "INF_VR_SI" e "INF_VR_NO" definidos en INFOR XA).</para>
        /// <para>Cabe apuntar que este formulario auxiliar le muestra al administrador del sistema las "anomalias" que se presenten en el mestro.</para>
        /// </summary>
        public RevisarEstadoProveedores()
        {
            InitializeComponent();

        }

        private void RevisarEstadoProveedores_Shown(object sender, EventArgs e)
        {
            Cursor.Current = Cursors.WaitCursor;

            DateTime fecha_minima = DateTime.Now;

            try
            {
                //--- consigo la fecha en la que se registro la ultima VR, solo se traeran desde MAPICS las VR con fecha de creacion posterior a esta fecha.
                fecha_minima = DateTime.Parse(this.pRV_DEVOLUCIONTableAdapter.Scalar_Max_fecha().ToString());
            }
            catch (Exception)
            {
                //-- si se presenta un error, es por que en la tabla PRV_DEVOLUCIONES no existen registros, en este caso la fecha minima sera: 1 de sepiembre del 2010,
                //-- en este fecha fue que se empezaron a implementar los codigos de causales.
                fecha_minima = DateTime.Parse("1/9/2010");
            }
            //--- las siguientes consultas son demoradas, solo por esta razon las realizo en este punto.
            this.iNF_VR_SITableAdapter.FillByFechas(this.mAPICSDataSet.INF_VR_SI, fecha_minima, DateTime.Now.AddHours(1));
            this.iNF_VR_NOTableAdapter.FillByFechas(this.mAPICSDataSet.INF_VR_NO, fecha_minima, DateTime.Now.AddHours(1));

            //---otros asistentes.
            this.proveedoresProximosAVencerse();
            this.activarProveedores();
            this.inactivarProveedores();
            this.proveedoresSinCuentaBancaria();
            this.proveedoresSinServicioPrincipal();
            this.VRSinCausales();
            this.actualizarResultadosEvaluacionDesempenoTrimestre();
            this.actualizarResultadosEvaluacionDesempenoAno();
            Cursor.Current = Cursors.Default;
            this.Close();
            return;
        }

        private void VRSinCausales()
        {
            string almacen = "";
            string motivo = "";
            string id_proveedor = "";
            //-- los datatables correspondientes se llenaron en RevisarEstadoProveedores_Shown().

            //--verifico aquellas devoluciones a las que se les definio el causal...
            foreach (MAPICS.MAPICSDataSet.INF_VR_SIRow row in this.mAPICSDataSet.INF_VR_SI)
            {
                if (!row.COMENTARIO.Trim().Equals("VR PILOTO"))//--- Este VR se agrego para realizar las pruebas previas, por eso de descarta.
                {
                    id_proveedor = "";
                    almacen = "";
                    motivo = "";

                    if (row.ALMACEN.Trim().Equals("001"))
                        almacen = "Mamonal";
                    else if (row.ALMACEN.Trim().Equals("002"))
                        almacen = "Boca Grande";
                    else
                        almacen = row.ALMACEN.Trim();

                    if (row.IsCOMENTARIONull())
                        motivo = "";
                    else
                        motivo = MAESTROS.ClassVarios.LimpiarCadena(row.COMENTARIO);

                    //-- le agrego el id del proveedor.
                    if (this.iNF_OCTableAdapter.FillByCod_OC(this.mAPICSDataSet.INF_OC, row.COD_OC) > 0)
                        id_proveedor = MAESTROS.ClassVarios.LimpiarCadena(this.mAPICSDataSet.INF_OC[0].COD_PRV);
                    //--- con la siguiente sentencia verifico que el codigo este registrado en la base de datos, en caso de que no este, lo dejo vacion para que el administrador lo asigne de forma manual.
                    if (this.prV_ENTREGAIMPERFECTA_MOTIVOTableAdapter.Scalar_isCodigoValido(Enums.EntregasImperfectas.Devolución.ToString(), motivo) == 0)
                        motivo = "";

                    try
                    {
                        this.pRV_DEVOLUCIONTableAdapter.Insert
                            (
                            MAESTROS.ClassVarios.LimpiarCadena(row.USUARIO) + row.HORA.Year + "" + row.HORA.Month + "" + row.HORA.Day + "" + row.HORA.Hour + "" + row.HORA.Minute + "" + row.HORA.Second + "" + row.HORA.Millisecond,
                            row.USUARIO.Trim(),
                            row.COD_OC,
                            row.COD_ITEM,
                            row.CAN_DEV,
                            motivo,
                            almacen,
                            row.HORA,
                            row.NUM_ITEM,
                            id_proveedor
                            );
                    }
                    catch (Exception) { }
                }
            }

            //--verifico aquellas devoluciones a las que NO se les definio el causal...
            foreach (MAPICS.MAPICSDataSet.INF_VR_NORow row in this.mAPICSDataSet.INF_VR_NO)
            {
                id_proveedor = "";
                almacen = "";
                motivo = "";

                if (row.ALMACEN.Trim().Equals("001"))
                    almacen = "Mamonal";
                else if (row.ALMACEN.Trim().Equals("002"))
                    almacen = "Boca Grande";
                else
                    almacen = row.ALMACEN.Trim();

                if (row.IsCOMENTARIONull())
                    motivo = "";
                else
                    motivo = "";
                //-- le agrego el id del proveedor.
                if (this.iNF_OCTableAdapter.FillByCod_OC(this.mAPICSDataSet.INF_OC, row.COD_OC) > 0)
                    id_proveedor = MAESTROS.ClassVarios.LimpiarCadena(this.mAPICSDataSet.INF_OC[0].COD_PRV);
                try
                {
                    this.pRV_DEVOLUCIONTableAdapter.Insert
                        (
                        MAESTROS.ClassVarios.LimpiarCadena(row.USUARIO) + row.HORA.Year + "" + row.HORA.Month + "" + row.HORA.Day + "" + row.HORA.Hour + "" + row.HORA.Minute + "" + row.HORA.Second + "" + row.HORA.Millisecond,
                        row.USUARIO.Trim(),
                        row.COD_OC,
                        row.COD_ITEM,
                        row.CAN_DEV,
                        motivo,
                        almacen,
                        row.HORA,
                        row.NUM_ITEM,
                        id_proveedor
                        );
                }
                catch (Exception) { }
            }
            //-- si existen vr's sin causal se las muestro aladministrador
            if (this.pRV_DEVOLUCIONTableAdapter.FillSinCausal(this.cORPORATIVADataSet.PRV_DEVOLUCION) > 0)
            {
                new ListarDevolucionesSinCausal().ShowDialog();
            }
        }

        private void activarProveedores()
        {
            //-- obtengo todos aquellos proveedores que se encuentran inactivos en el maestro
            pRV_PROVEEDORTableAdapter.FillByIsActivo(cORPORATIVADataSet.PRV_PROVEEDOR, false);
            foreach (_Maestro_Proveedores_CORPORATIVADataSet.PRV_PROVEEDORRow row in cORPORATIVADataSet.PRV_PROVEEDOR)
            {
                //-- verifico y actualizo el estado "activo" de aquellos proveedores que han sido reactivados desde INFOR XA y aun siguen inactivos en el maestro
                if (pROVEEDORESTableAdapter.FillByID(pROVEEDORESDataTable, row.id) > 0)
                {
                    this.prV_PROVEEDORTableAdapter.Update_activo(true, row.id);
                }
            }
        }

        private void inactivarProveedores()
        {
            //-- obtengo todos aquellos proveedores que se encuentran activos en el maestro
            pRV_PROVEEDORTableAdapter.FillByIsActivo(cORPORATIVADataSet.PRV_PROVEEDOR, false);
            foreach (_Maestro_Proveedores_CORPORATIVADataSet.PRV_PROVEEDORRow row in cORPORATIVADataSet.PRV_PROVEEDOR)
            {
                //-- verifico y actualizo el estado "activo" de aquellos proveedores que han sido desactivados desde INFOR XA y aun siguen activos en el maestro
                if (pROVEEDORESTableAdapter.FillByID(pROVEEDORESDataTable, row.id) == 0)
                {
                    this.prV_PROVEEDORTableAdapter.Update_activo(false, row.id);
                }                
            }
        }

        private void proveedoresProximosAVencerse() 
        {
            DataTable prv_proximosAVencerse = new DataTable();
            prv_proximosAVencerse.Columns.Add("ID", Type.GetType("System.Double"));
            prv_proximosAVencerse.Columns.Add("RAZON_SOCIAL", Type.GetType("System.String"));
            prv_proximosAVencerse.Columns.Add("DIAS_RESTANTES", Type.GetType("System.Double"));
            prv_proximosAVencerse.Columns.Add("FECHA_VENCIMIENTO", Type.GetType("System.DateTime"));

            try
            {
                this.progressBar1.Maximum = pRV_PROVEEDORTableAdapter.FillByIsActivo(cORPORATIVADataSet.PRV_PROVEEDOR, true);
            }
            catch (Exception) { }

            this.progressBar1.Step = 1;
            foreach (_Maestro_Proveedores_CORPORATIVADataSet.PRV_PROVEEDORRow row in cORPORATIVADataSet.PRV_PROVEEDOR)
            {
                //--- si el proveedor esta activo en INFOR
                if (pROVEEDORESTableAdapter.FillByID(pROVEEDORESDataTable, row.id) > 0)
                {
                    //-- verifico que el plazo para renovar su activacion no este proximo a vencerse...
                    double dias = Math.Round(((row.fecha_vencimiento - DateTime.Now).TotalDays), 0);
                    if (dias <= 15)
                    {
                        prv_proximosAVencerse.Rows.Add(prv_proximosAVencerse.NewRow());
                        prv_proximosAVencerse.Rows[prv_proximosAVencerse.Rows.Count - 1]["ID"] = row.id;
                        prv_proximosAVencerse.Rows[prv_proximosAVencerse.Rows.Count - 1]["RAZON_SOCIAL"] = row.razon_social;
                        prv_proximosAVencerse.Rows[prv_proximosAVencerse.Rows.Count - 1]["DIAS_RESTANTES"] = dias;
                        prv_proximosAVencerse.Rows[prv_proximosAVencerse.Rows.Count - 1]["FECHA_VENCIMIENTO"] = row.fecha_vencimiento;
                    }
                    this.progressBar1.PerformStep();
                }
            }

            if (prv_proximosAVencerse.Rows.Count > 0)
            {
                new ListarProveedoresProximosAVencerse(prv_proximosAVencerse);
            }
        }

        private void proveedoresSinCuentaBancaria() 
        {   
            //-- si existen proveedores sin cuentas bancarias, entonces se debe mostrar la ventana emergente.
            new ListarProveedoresSinCuentaBancaria();            
        }

        private void proveedoresSinServicioPrincipal() 
        {
            //--- si hay proveedores sin cuentas bancarias activas, entonces se debe mostrar la ventana emergente.
            new ListarProveedoresSinServicioPrincipal();            
        }

        private void actualizarResultadosEvaluacionDesempenoTrimestre()
        {
            //-- inicializo las variables
            evaluacionDeDesempeno.EvaluacionDeDesempeno evaluacionDeDesempeno = new Maestro_Proveedores.evaluacionDeDesempeno.EvaluacionDeDesempeno();
            DateTime hoy=DateTime.Now;
            //--- fecha en la que debe actualizarse nuevamente la evaluacion de desempeño.
            DateTime proximaActualizacion = DateTime.Now;
            //--- fecha inferior con la que se calculara la evaluacion de desempeño.
            DateTime fechaInferior = DateTime.Now;
            //--- fecha superior con la que se calculara la evaluacion de desempeño. 
            DateTime fechaSuperior = DateTime.Now;
            //--- dataTable conlos datos del proveedor.
            DataTable datos = null;

            try
            {   
                //- verifico si debo actualizar el resultado de la evaluacion.
                //---- esto lo compruebo leyendo el archivo (FechaActualizacionEvalDesempenoTrimestre.PRV) 
                //---- ESTE ARCHIVO ESTA EN LA CARPETA ASIGNADA PARA GESTIONAR LOS DOCUMENTOS Y SOPORTES DEL MAESTRO.
                //---- pude haberlo trabajado en la base de datos, pero no lo considere necesario crear una tabla o un campo para guardar solo esta fecha.
                System.IO.StreamReader ficheroR = new System.IO.StreamReader(ConfiguracionDelSistema.ArchivoFechaActualizacionEvalDesempenoTrimestre);
                DateTime fechaActualizacion = DateTime.Now;
                string cuerpo = ficheroR.ReadToEnd().Trim();
                string[] temp=cuerpo.Split("\n".ToCharArray());
                //--- obtengo la fecha de actualizacion.
                try
                {
                    fechaActualizacion = DateTime.Parse(temp[temp.Length-1].Trim());
                }
                catch (Exception) { }
                
                ficheroR.Close();
                //--- si la fecha de actualización no ha llegado aun, entonces no sigo.
                if (fechaActualizacion > hoy)
                    return;
                //--- encuentro el rango de fecha del trimestre aterior y la fecha de la proxima actualización.
                if (1 <= hoy.Month && hoy.Month < 4) 
                {
                    fechaInferior = DateTime.Parse("1/10/"+(hoy.Year-1)+" 00:00:00");
                    fechaSuperior = DateTime.Parse("1/1/" + hoy.Year + " 00:00:00");
                    proximaActualizacion = DateTime.Parse("1/4/" + hoy.Year + " 00:00:00");
                }
                else if (4 <= hoy.Month && hoy.Month < 7)
                {
                    fechaInferior = DateTime.Parse("1/1/" + hoy.Year + " 00:00:00");
                    fechaSuperior = DateTime.Parse("1/4/" + hoy.Year + " 00:00:00");
                    proximaActualizacion = DateTime.Parse("1/7/" + hoy.Year + " 00:00:00");
                }
                else if (7 <= hoy.Month && hoy.Month < 10)
                {
                    fechaInferior = DateTime.Parse("1/4/" + hoy.Year + " 00:00:00");
                    fechaSuperior = DateTime.Parse("1/7/" + hoy.Year + " 00:00:00");
                    proximaActualizacion = DateTime.Parse("1/10/" + hoy.Year + " 00:00:00");
                }
                else
                {
                    fechaInferior = DateTime.Parse("1/7/" + hoy.Year + " 00:00:00");
                    fechaSuperior = DateTime.Parse("1/10/" + hoy.Year + " 00:00:00");
                    proximaActualizacion = DateTime.Parse("1/1/" + (hoy.Year+1) + " 00:00:00");
                }
                
                //-- le pregunto al usuario pregunto si desea continuar
                if (MessageBox.Show("¿Desea actualizar los resultados de la evaluación de desempeño para el TRIMESTRE anterior?.\n\nEsta operación puede tardar varios minutos.", "", MessageBoxButtons.YesNo, MessageBoxIcon.Information).Equals(DialogResult.No))
                    return;

                ////MessageBox.Show(fechaActualizacion + " - " + fechaInferior + " - " + fechaSuperior + " - " + proximaActualizacion);

                //-- si hay proveedores validos en la BD actualizo sus resultados de evaluacion de desempeño.
                this.progressBar1.Maximum = this.cONSULTA_proveedoresTableAdapter.Fill(this.cORPORATIVADataSet.CONSULTA_proveedores);
                if (this.progressBar1.Maximum > 0)
                {
                    //-- reinicio la barra de estado
                    this.progressBar1.Value = 1;
                    //--- empiezo a realizar la evalucion proveedor por proveedor.
                    foreach (_Maestro_Proveedores_CORPORATIVADataSet.CONSULTA_proveedoresRow row in this.cORPORATIVADataSet.CONSULTA_proveedores)
                    {
                        datos = evaluacionDeDesempeno.evaluarByIdProveedor(row.id_proveedor, fechaInferior, fechaSuperior);
                        
                        //-- si logro realizarse la evaluacion de desempeño, actualizo el valor
                        if (datos.Rows.Count > 0)
                        {
                            //-- si el resultado dela evalucion, es distinto de -1, entonces actualizo su valor.
                            //if (!datos.Rows[0]["RESULTADO FINAL(%)"].ToString().equals("-1"))
                            //{
                                this.prV_PROVEEDORTableAdapter.Update_evalDesempeno(decimal.Parse(datos.Rows[0]["RESULTADO FINAL(%)"].ToString()), row.id_proveedor);
                            //}
                        }
                        this.progressBar1.PerformStep();                        
                        }
                }
                //-- actualizo la fecha solo si estoy conectado al servidor POSEIDON
                if (!Maestro_Proveedores.Properties.Settings.Default.PRV_ConnectionString.ToUpper().Contains("POSEIDON"))
                    return;
                //-- actualizo la fecha de la proxima actualizacion en el archivo FechaActualizacionEvalDesempenoTrimestre.PRV
                System.IO.StreamWriter ficheroW = new System.IO.StreamWriter(ConfiguracionDelSistema.ArchivoFechaActualizacionEvalDesempenoTrimestre);
                ficheroW.Flush();
                ficheroW.WriteLine(cuerpo);
                ficheroW.WriteLine("");
                ficheroW.WriteLine("");
                ficheroW.WriteLine("Usuario->" + Session.Seg_USUARRow.USUARIO + ", Fecha de actualizacion->" + DateTime.Now + ", Proxima fecha de actualizacion:");
                ficheroW.WriteLine(proximaActualizacion.ToShortDateString());
                             
                ficheroW.Close();
            }
            catch (Exception ex) 
            {
                //MessageBox.Show("Actualmente usted no tiene acceso a los documentos de soporte.\n\nDebe ponerse en contacto con el administrador del sistema para que solucione este inconveniente.");
                herramientas.MessageException.show(ex);
            }
        }

        private void actualizarResultadosEvaluacionDesempenoAno()
        {
            //-- inicializo las variables
            evaluacionDeDesempeno.EvaluacionDeDesempeno evaluacionDeDesempeno = new Maestro_Proveedores.evaluacionDeDesempeno.EvaluacionDeDesempeno();
            DateTime hoy = DateTime.Now;
            //--- fecha en la que debe actualizarse nuevamente la evaluacion de desempeño.
            DateTime proximaActualizacion = DateTime.Now;
            //--- fecha inferior con la que se calculara la evaluacion de desempeño.
            DateTime fechaInferior = DateTime.Now;
            //--- fecha superior con la que se calculara la evaluacion de desempeño. 
            DateTime fechaSuperior = DateTime.Now;
            //--- dataTable con los datos del proveedor.
            DataTable datos = null;

            try
            {
                //- verifico si debo actualizar el resultado de la evaluacion.
                //---- esto lo compruebo leyendo el archivo (FechaActualizacionEvalDesempenoTrimestreAno.PRV) 
                //---- ESTE ARCHIVO ESTA EN LA CARPETA ASIGNADA PARA GESTIONAR LOS DOCUMENTOS Y SOPORTES DEL MAESTRO.
                //---- pude haberlo trabajado en la base de datos, pero no lo considere necesario crear una tabla o un campo para guardar solo esta fecha.
                System.IO.StreamReader ficheroR = new System.IO.StreamReader(ConfiguracionDelSistema.ArchivoFechaActualizacionEvalDesempenoAno);
                DateTime fechaActualizacion = DateTime.Now;
                string cuerpo = ficheroR.ReadToEnd().Trim();
                string[] temp = cuerpo.Split("\n".ToCharArray());
                //--- obtengo la fecha de actualizacion.
                try
                {
                    fechaActualizacion = DateTime.Parse(temp[temp.Length - 1].Trim());
                }
                catch (Exception) { }

                ficheroR.Close();
                //--- si la fecha de actualización no ha llegado aun, entonces no sigo.
                if (fechaActualizacion > hoy)
                    return;
                //--- encuentro el rango de fecha del Año aterior y la fecha de la proxima actualización.
                    fechaInferior = DateTime.Parse("1/1/" + (hoy.Year - 1) + " 00:00:00");
                    fechaSuperior = DateTime.Parse("1/1/" + hoy.Year + " 00:00:00");
                    proximaActualizacion = DateTime.Parse("1/1/" + (hoy.Year+1) + " 00:00:00");
                
                //-- le pregunto al usuario pregunto si desea continuar
                if (MessageBox.Show("¿Desea actualizar los resultados de la evaluación de desempeño para el AÑO anterior?.\n\nEsta operación puede tardar varios minutos.", "", MessageBoxButtons.YesNo, MessageBoxIcon.Information).Equals(DialogResult.No))
                    return;

                //MessageBox.Show(fechaActualizacion + " - " + fechaInferior + " - " + fechaSuperior + " - " + proximaActualizacion);

                //-- si hay proveedores validos en la BD actualizo sus resultados de evaluacion de desempeño.
                this.progressBar1.Maximum = this.cONSULTA_proveedoresTableAdapter.Fill(this.cORPORATIVADataSet.CONSULTA_proveedores);
                if (this.progressBar1.Maximum > 0)
                {
                    //-- reinicio la barra de estado
                    this.progressBar1.Value = 1;
                    //--- empiezo a realizar la evalucion proveedor por proveedor.
                    foreach (_Maestro_Proveedores_CORPORATIVADataSet.CONSULTA_proveedoresRow row in this.cORPORATIVADataSet.CONSULTA_proveedores)
                    {
                        datos = evaluacionDeDesempeno.evaluarByIdProveedor(row.id_proveedor, fechaInferior, fechaSuperior);
                        //MessageBox.Show(datos.Rows[0]["RESULTADO FINAL(%)"].ToString() + " - " + row.id_proveedor + " - " + this.progressBar1.Value.ToString());
                        if (datos.Rows.Count > 0)
                        {
                            this.prV_PROVEEDORTableAdapter.Update_evalDesempenoAno(decimal.Parse(datos.Rows[0]["RESULTADO FINAL(%)"].ToString()), row.id_proveedor);
                        }
                        this.progressBar1.PerformStep();                        
                    }
                }
                //-- actualizo la fecha solo si estoy conectado al servidor POSEIDON
                if (!Maestro_Proveedores.Properties.Settings.Default.PRV_ConnectionString.ToUpper().Contains("POSEIDON"))
                    return;
                //-- actualizo la fecha de la proxima actualizacion en el archivo FechaActualizacionEvalDesempeno.PRV
                System.IO.StreamWriter ficheroW = new System.IO.StreamWriter(ConfiguracionDelSistema.ArchivoFechaActualizacionEvalDesempenoAno);
                ficheroW.Flush();
                ficheroW.WriteLine(cuerpo);
                ficheroW.WriteLine("");
                ficheroW.WriteLine("");
                ficheroW.WriteLine("Usuario->" + Session.Seg_USUARRow.USUARIO + ", Fecha de actualizacion->" + DateTime.Now + ", Proxima fecha de actualizacion:");
                ficheroW.WriteLine(proximaActualizacion.ToShortDateString());
                
                ficheroW.Close();
            }
            catch (Exception ex)
            {
                herramientas.MessageException.show(ex);
            }
        }
    }
}
